perm filename CRDFNC.SAI[S,HE] blob
sn#658969 filedate 1982-05-14 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY SWITCHCHAN,IFVCOUTPUT,IFVCURSORMAP,IFVCMAP,GETIFVCMAP,ZOOM_PAN,
C00009 00003 INTERNAL PROCEDURE ZOOM_PAN(INTEGER CHAN, ZOOMFACTOR, ELEMENT, LINE, CONTROL_BITS)
C00010 00004 ! Cursor read back and control routines
C00015 00005 INTERNAL PROCEDURE DIGITIZE(INTEGER THRESHOLD, SHIFT, NFRAMES, CONTROL_BITS, DATASET(0))
C00017 00006 ! Image Analyzer Card funtions
C00021 00007 ! IMAGE PROCESSOR CARD ROUTINES
C00024 00008 END "CRDFNC"
C00026 ENDMK
C⊗;
ENTRY SWITCHCHAN,IFVCOUTPUT,IFVCURSORMAP,IFVCMAP,GETIFVCMAP,ZOOM_PAN,
GINQUIRE_CURSOR, GSHOW_CURSOR,
GABS_SET_CURSOR,GREL_SET_CURSOR,DIGITIZE,MAXMIN,GDISTRIBUTION,
GHISTOGRAM,
IPCMAP,IPCSWITCH,IPCCONTROL,IPCCTRLMODE,IPCWRITE;
DEFINE !="COMMENT";
DEFINE TO="STEP 1 UNTIL";
BEGIN "CRDFNC"
REQUIRE "GRNDEF[HDR,HE]" SOURCE_FILE;
REQUIRE "GRNHDR[HDR,HE]" SOURCE_FILE;
! Routines to control image function video control;
INTERNAL PROCEDURE SWITCHCHAN(INTEGER CARD, SOURCEA, SOURCEB, SOURCEC);
BEGIN "Switch"
Comment This routine will switch the channel to the specified table on the
specified card (0 or 1);
GRNINS(SPD LOR READBACK); ! Selecting READBACK as a peripheral;
! devices Read allows access to the;
! Peripheral Control bits to specify;
! which of 2 cards is to be used;
IF CARD = 1 THEN GRNINS(LPR LOR VIDMAP1) ELSE GRNINS(LPR LOR VIDMAP0);
GRNINS(SPD LOR IFNCVID); ! Selects the Image Video Function;
! Switch specified channel to the specified lookup table;
! NOTE that chan must be between 0-3, and tableno is between 0-2;
GRNINS(LPR4 LOR (SOURCEC LSH 4) LOR (SOURCEB LSH 2) LOR SOURCEA);
END "Switch";
INTERNAL PROCEDURE IFVCOUTPUT(INTEGER CARD, BYPASSMAP, INVERTMAP, CLAMPMAP, OVERLAYMAP);
BEGIN "IFVCOUTPUT"
! This routine controls the output of the Image Function Video Card;
GRNINS(SPD LOR READBACK);
IF CARD = 1 THEN GRNINS(LPR LOR VIDMAP1) ELSE GRNINS(LPR LOR VIDMAP0);
GRNINS(SPD LOR IFNCVID); ! Selects the Image Video Function;
GRNINS(LPR5 LOR (CLAMPMAP LSH 6) LOR (INVERTMAP LSH 3) LOR BYPASSMAP);
GRNINS(LPR1 LOR (OVERLAYMAP LSH 4));
END "IFVCOUTPUT";
INTERNAL PROCEDURE IFVCURSORMAP(INTEGER CARD, BYPASSMAP, INVERTMAP, CLAMPMAP, OVERLAYMAP);
BEGIN "IFVCOUTPUT"
! This routine controls the output of the Image Function Video Card;
! The maps indicate the effects of the lookup tables on the card ;
! Each of the three tables is controled by a bit in the map ;
! If the bit is on the option is selected. eg. if the BYPASSMAP is ;
! '6 then lookup tables A and C will be bypassed ;
GRNINS(SPD LOR READBACK);
IF CARD = 1 THEN GRNINS(LPR LOR VIDMAP1) ELSE GRNINS(LPR LOR VIDMAP0);
GRNINS(SPD LOR IFNCVID); ! Selects the Image Video Function;
GRNINS(LPR5 LOR (CLAMPMAP LSH 6) LOR (INVERTMAP LSH 3) LOR BYPASSMAP);
GRNINS(LPR1 LOR OVERLAYMAP);
GRNINS(LPR2 LOR OVERLAYMAP);
GRNINS(LPR3 LOR OVERLAYMAP);
END "IFVCOUTPUT";
INTERNAL PROCEDURE IFVCMAP(INTEGER CARD, TABLENO; INTEGER ARRAY MAP;
INTEGER ADR(0), COUNT(256));
BEGIN "IFVCMAP"
INTEGER I;
GRNINS(SPD LOR READBACK); ! Selecting READBACK as a peripheral;
! devices Read allows access to the;
! Peripheral Control bits to specify;
! which of 2 cards is to be used;
IF CARD = 1 THEN GRNINS(LPR LOR VIDMAP1) ELSE GRNINS(LPR LOR VIDMAP0);
GRNINS(SPD LOR IFNCVID); ! Selects the Image Video Function;
! Select lookup table and address to write into. If table no is 3 all lookup;
! tables are written into simultaneously;
GRNINS(LPA LOR ((TABLENO MOD 4) LSH 10) LOR (ADR MOD 256));
! Load map into lookup tables;
FOR I ← 0 TO COUNT-1 DO GRNINS(LPD LOR MAP[I]);
END "IFVCMAP";
INTERNAL PROCEDURE GETIFVCMAP(INTEGER CARD,TABLENO; INTEGER ARRAY MAP;
INTEGER ADR(0),COUNT(256));
BEGIN "GETIFVCMAP"
GRNINS(SPD LOR READBACK); ! Selecting READBACK as a peripheral;
! devices Read allows access to the;
! Peripheral Control bits to specify;
! which of 2 cards is to be used;
IF CARD = 1 THEN GRNINS(LPR LOR VIDMAP1) ELSE GRNINS(LPR LOR VIDMAP0);
GRNINS(SPD LOR IFNCVID); ! Selects the Image Video Function;
! Select lookup table and address to write into. If table no is 3 all lookup;
! tables are written into simultaneously;
GRNINS(LPA LOR ((TABLENO MOD 4) LSH 10) LOR (ADR MOD 256));
! Read back data into Array;
GRNIN(LOCATION(MAP[ARRINFO(MAP,1)]), COUNT);
END "GETIFVCMAP";
INTERNAL PROCEDURE ZOOM_PAN(INTEGER CHAN, ZOOMFACTOR, ELEMENT, LINE, CONTROL_BITS);
BEGIN "ZOOM_PAN"
GRNINS(SPD LOR READBACK);
GRNINS(LPR LOR ('1 LSH CHAN));
GRNINS(SPD LOR ZOOM);
GRNINS(LPA);
GRNINS(LPD LOR ELEMENT);
GRNINS(LPD LOR LINE);
GRNINS(LPR LOR ENAZOOM LOR CONTROL_BITS LOR (ZOOMFACTOR MOD 4));
END "ZOOM_PAN";
! Cursor read back and control routines;
INTERNAL PROCEDURE GINQUIRE_CURSOR(INTEGER CURSNO; REFERENCE INTEGER ELEMENT, LINE;
REFERENCE BOOLEAN FUNA, FUNB, ENTERFLAG);
BEGIN "GINQUIRE_CURSOR"
! This routine returns the current line, element and status of the flags for the ;
! specified cursor;
INTEGER ARRAY CURSORINFO[1:2]; ! Storage for element and line registers;
GRNINS(SPD LOR CURSOR);
GRNINS(LPA LOR (((CURSNO - 1) MOD 4) LSH 1));
GRNIN(LOCATION(CURSORINFO[1]), 2); ! Read back element and line register;
! from DR11B;
IF CURSORINFO[1] LAND ENTERBIT = 0 THEN ENTERFLAG ← FALSE ELSE ENTERFLAG ← TRUE;
IF CURSORINFO[1] LAND F1BIT = 0 THEN FUNB ← FALSE ELSE FUNB ← TRUE;
IF CURSORINFO[1] LAND F2BIT = 0 THEN FUNA ← FALSE ELSE FUNA ← TRUE;
ELEMENT ← CURSORINFO[1] LAND '1777;
LINE ← CURSORINFO[2] LAND '1777;
END "GINQUIRE_CURSOR";
INTERNAL PROCEDURE GABS_SET_CURSOR(INTEGER CURSNO, ELEMENT, LINE);
! Move the cursor tho the given position;
! ELEMENT and LINE are screen coordiates;
BEGIN "GSET_CURSOR_ABS"
GRNINS(SPD LOR CURSOR); ! Select cursor device;
GRNINS(LPA LOR (((CURSNO - 1) MOD 4) LSH 1)); ! Select one of the cursors;
GRNINS(LPD LOR ABSOLUTELY LOR ELEMENT); ! Specify new element;
GRNINS(LPD LOR ABSOLUTELY LOR LINE); ! and new line coordinates;
END "GSET_CURSOR_ABS";
INTERNAL PROCEDURE GREL_SET_CURSOR(INTEGER CURSNO, DX, DY);
! Move cursor relative to current position by given displacements (dx, dy);
BEGIN "GSET_CURSOR_REL"
GRNINS(SPD LOR CURSOR); ! Select curosr device;
GRNINS(LPA LOR (((CURSNO - 1) MOD 4) LSH 1)); ! and one of the 4 cursors;
GRNINS(LPD LOR RELATIVELY LOR DX); ! Specify displacement from;
GRNINS(LPD LOR RELATIVELY LOR DY); ! old position;
END "GSET_CURSOR_REL";
INTERNAL PROCEDURE GSHOW_CURSOR(INTEGER VISBITS, BLINKBITS);
! Will turn the grinnell cursors on or off and cause them to blink;
! The low order bits in VISBITS and BLINKBITS correspond to one of the cursors;
! If the bit is 1 in VISBITS then the corresponding cursor will be visible, ;
! likewise in BLINKBITS. Note a cursor must be visible to see the blinking effect;
! For example if VISBITS = 9 and BLINKBITS = 8 then cursor 1 and 4 would be;
! made visible with cursor four blinking. Note that this routine will alter;
! the previous states of the cursors. ;
! The following bits have been defined in GRNDEF[HDR,HE]:
! QCURSALL = 17 all four cursors;
! QCURS1 = 1 Cursor 1 (also QCURS2,3,4 are defined);
BEGIN "GSHOW_CURSOR"
GRNINS(SPD LOR CURSOR); ! Select cursor device;
GRNINS(LPR LOR (BLINKBITS LSH 4) LOR VISBITS); ! Select cursors to be
! visible and blinking;
END "GSHOW_CURSOR";
INTERNAL PROCEDURE DIGITIZE(INTEGER THRESHOLD, SHIFT, NFRAMES, CONTROL_BITS, DATASET(0));
BEGIN "DIGITIZE"
! Digitizer writes into memory channels 2,3 which must be enabled;
GRNINS(LDC LOR '14); GRNINS(LSM LOR '377);
GRNINS(SPD LOR READBACK); ! Digitizer is selected by loading PCR;
GRNINS(LPR LOR '1); ! bit 0 and selecting periphereal device;
GRNINS(SPD LOR DIGITIZER); ! bit corresponding to the digitizer;
! Also specify threshold and number of bits data is to be shifted, and which data
arithmetic is done with;
GRNINS(LPR LOR (DATASET LSH 10) LOR (THRESHOLD LSH 4) LOR SHIFT);
! Set continuity bit, arithmetic mode and threshhold mode and number of;
! frames to be read in if not in continuous mode;
GRNINS(LPD LOR CONTROL_BITS LOR NFRAMES);
END "DIGITIZE";
! Image Analyzer Card funtions;
INTERNAL PROCEDURE GDISTRIBUTION(INTEGER SOURCE; REFERENCE INTEGER ARRAY COUNTS;
INTEGER STARTVAL,NVALS, READBACKMODE, HISTOGRAMMODE);
BEGIN "GDISTRIBUTION"
GRNINS(SPD LOR ANALYZER);
GRNINS(LPR4 LOR (SOURCE MOD 5));
GRNINS(LPA LOR READBACKMODE LOR STARTVAL);
GRNINS(LPR5 LOR HISTOGRAMMODE);
GRNINS(LPD);
GRNIN(LOCATION(COUNTS[ARRINFO(COUNTS,1)]), NVALS);
END "GDISTRIBUTION";
INTERNAL PROCEDURE GHISTOGRAM(INTEGER SOURCE; REFERENCE INTEGER ARRAY COUNTS);
BEGIN "GHISTOGRAM"
INTEGER ARRAY COUNT[0:255], COUNTH[0:255];
INTEGER I,J;
GDISTRIBUTION(SOURCE,COUNT,0,256,LSBITS,NOHISTOGRAM);
GDISTRIBUTION(SOURCE,COUNTH,0,256,MSBITS,NOHISTOGRAM);
COMMENT Take 16 MSB's, pick out top two bits, and or them into LSBs.;
FOR I ← 0 STEP 1 UNTIL 255 DO
COUNT[I] ← COUNT[I] LOR ((COUNTH[I] LAND '140000) LSH 2);
J←ARRINFO(COUNTS,1);
FOR I ← 0 STEP 1 UNTIL 255 DO
BEGIN
COUNTS[J]←COUNT[I];
J←J+1
END;
END "GHISTOGRAM";
INTERNAL PROCEDURE MAXMIN(INTEGER SOURCE; REFERENCE INTEGER MAXIMUM, MINIMUM);
BEGIN "MAXMIN"
COMMENT If the max/min logic is busted, just read back the histogram and manually
find the maximum and minimum.;
IFC MXMNBUSTED THENC
INTEGER ARRAY COUNTS[0:255];
INTEGER I;
BOOLEAN GOTIT;
GHISTOGRAM(SOURCE,COUNTS);
GOTIT←FALSE; I←0;
WHILE NOT(GOTIT) DO
BEGIN
GOTIT←COUNTS[I] ≠ 0;
I←I+1
END;
MINIMUM←I-1;
GOTIT←FALSE; I←255;
WHILE NOT(GOTIT) DO
BEGIN
GOTIT←COUNTS[I] ≠ 0;
I←I-1
END;
MAXIMUM←I+1
ELSEC
INTEGER ARRAY EXTREMES[1:2];
GRNINS(SPD LOR ANALYZER); ! Select Image Analyzer Card;
GRNINS(LPR4 LOR (SOURCE MOD 5)); ! Switch input to given source;
GRNINS(LPD); ! Initialize analyzer memories and reg;
GRNINS(LPA LOR GETMIN); ! Set readback mode to minimum;
GRNIN(LOCATION(EXTREMES[1]),2); ! Read back the minimum and maximum;
MINIMUM ← EXTREMES[1];
MAXIMUM ← EXTREMES[2];
ENDC
END "MAXMIN";
! IMAGE PROCESSOR CARD ROUTINES;
INTERNAL PROCEDURE IPCMAP(INTEGER TABLE_ENABLES; INTEGER ARRAY MAP; INTEGER COUNT,
STARTADR (0));
BEGIN "IPCMAP"
INTEGER I;
GRNINS(SPD LOR PROCESSOR);
GRNINS(LPR1 LOR TABLE_ENABLES);
GRNINS(LPA LOR STARTADR);
FOR I ← 0 TO COUNT-1 DO GRNINS(LPD LOR MAP[I]);
END "IPCMAP";
INTERNAL PROCEDURE GETIPCMAP(INTEGER MEMORY; INTEGER ARRAY MAP);
BEGIN "GETIPCMAP"
INTEGER I;
GRNINS(SPD LOR PROCESSOR);
GRNINS(LPR1 LOR (1 LSH MEMORY));
GRNINS(LPA LOR 0);
GRNINS(RPD);
GRNIN(LOCATION(MAP[ARRINFO(MAP,1)]), 256);
END "GETIPCMAP";
INTERNAL PROCEDURE IPCSWITCH(INTEGER SOURCE0, SOURCE1, SOURCE2, SOURCE3, AUXILIARY);
BEGIN "IPCSWITCH"
GRNINS(SPD LOR PROCESSOR);
GRNINS(LPR4 LOR (AUXILIARY LSH 8) LOR (SOURCE3 LSH 6) LOR (SOURCE2 LSH 4)
LOR (SOURCE1 LSH 2) LOR SOURCE0);
END "IPCSWITCH";
INTERNAL PROCEDURE IPCCONTROL(INTEGER REGISTER, CONTROL_BITS);
BEGIN "IPCCONTROL"
GRNINS(SPD LOR PROCESSOR);
IF REGISTER = 6 OR REGISTER = 7 THEN
GRNINS(LPR LOR (REGISTER LSH 9) LOR CONTROL_BITS);
END "IPCCONTROL";
INTERNAL PROCEDURE IPCCTRLMODE(INTEGER CONTROL_BITS);
BEGIN "IPCCTRLMODE"
GRNINS(SPD LOR PROCESSOR);
GRNINS(LPR5 LOR CONTROL_BITS);
END "IPCCTRLMODE";
INTERNAL PROCEDURE IPCWRITE(INTEGER CHAN_ENABLES, WRITEMODE);
BEGIN "IPCWRITE"
GRNINS(LDC LOR CHAN_ENABLES);
GRNINS(SPD LOR PROCESSOR);
GRNINS(LPR LOR WRITEMODE);
END "IPCWRITE";
END "CRDFNC"